package Servlets;

import Estructuras.Principales.ReportesPrincipalDTO;
import Estructuras.Principales.TarryPrincipal;
import Herramientas.Herramientas;
import Herramientas.MailMotor;
import TarryDAOS.CarteraVencidaDAO;
import TarryDAOS.ClientesDAO;
import TarryDAOS.ImpuestosDAO;
import TarryDAOS.ProductosVentaDAO;
import TarryDAOS.RegistroEnvioDAO;
import TarryDAOS.TarryItemsPedidoDAO;
import TarryDAOS.TarryPedidosDAO;
import TarryDTOS.CarteraVencidaDTO;
import TarryDTOS.ClientesDTO;
import TarryDTOS.ImpuestosDTO;
import TarryDTOS.ProductosVentaDTO;
import TarryDTOS.RegistroEnvioDTO;
import TarryDTOS.TarryPedidosDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author MauricioAlanGonzalez
 */
@WebServlet(name = "TarryAux", urlPatterns = {"/TarryAux"})
public class TarryAux extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String action = request.getParameter("action");
            HttpSession session = request.getSession();

// CONTROLADOR DE SERVICIOS
            if (action.equals("configuracionProductosIEPS")) {
                this.configuracionProductosIEPS(request, response, session);

            } else if (action.equals("nuevaConfiguracionIEPS")) {
                this.nuevaConfiguracionIEPS(request, response, session);

            } else if (action.equals("configuracionImpuestos")) {
                this.configuracionImpuestos(request, response, session);

            } else if (action.equals("actualizaConfiguracionImpuestos")) {
                this.actualizaConfiguracionImpuestos(request, response, session);

            } else if (action.equals("nuevoImpuesto")) {
                this.nuevoImpuesto(request, response, session);

            } else if (action.equals("informeAlmacen")) {
                this.informeAlmacen(request, response, session);

            } else if (action.equals("revisionBanderasCredito")) {
                this.revisionBanderasCredito(request, response, session);

            } else if (action.equals("pedidoEntregado")) {
                this.pedidoEntregado(request, response, session);

            } else if (action.equals("detallePedido")) {
                this.detallePedido(request, response, session);

            } else {
                System.out.println("ERROR AL ACCESO DEL SERVICIO | SERVICIO DESCONOCIDO");
            }
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * ALAN GONZALEZ - SERVICIO QUE MUESTRA LOS PRODUCTOS QUE ESTAN GRAVADOS O
     * NO CON IEPS
     *
     *
     * @param request
     * @param response
     * @param session
     */
    public void configuracionProductosIEPS(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        Herramientas herramientas = new Herramientas();
        TarryPrincipal principal = new TarryPrincipal();
        ProductosVentaDAO productosVentaDAO = new ProductosVentaDAO();
        Vector productosIEPS = new Vector();
        productosIEPS = productosVentaDAO.todoProducto();
        principal.setProductos(productosIEPS);
        session.setAttribute("tarryPrincipal", principal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/productosIEPS.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ
     *
     * @param request
     * @param response
     * @param session
     */
    public void nuevaConfiguracionIEPS(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");
        Vector vProductos = principal.getProductos();
        ProductosVentaDAO productosVentaDAO = new ProductosVentaDAO();
        int vAux = 0;
        for (vAux = 0; vAux < vProductos.size(); vAux++) {
            ProductosVentaDTO producto = (ProductosVentaDTO) vProductos.elementAt(vAux);
            int idProducto = producto.getId();

            if (request.getParameter("check_" + idProducto) != null) {
                productosVentaDAO.actualizaConfiguracionIEPS(idProducto, 1);
            } else if (request.getParameter("check_" + idProducto) == null) {
                productosVentaDAO.actualizaConfiguracionIEPS(idProducto, 0);
            }
        }
        RequestDispatcher d = request.getRequestDispatcher("./TarryAux?action=configuracionProductosIEPS");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO PARA MOSTRAR EL JSP DE CONFIGURACION DE IMPUESTOS
     *
     * @param request
     * @param response
     * @param session
     */
    public void configuracionImpuestos(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = new TarryPrincipal();
        ImpuestosDAO impuestosDAO = new ImpuestosDAO();
        ImpuestosDTO impuestosDTO = new ImpuestosDTO();
        impuestosDTO = impuestosDAO.configuracionImpuestos();
        principal.setImpuestoDTO(impuestosDTO);
        session.setAttribute("tarryPrincipal", principal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/impuestos.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO QUE OBTIENE DE LA INTERFAZ LOS NUEVOS VALORES PARA
     * LA CONFIGURACION DE IMPUESTOS ESTE MODULO AFECTARA TODOS LOS CALCULOS
     * FISCALES
     *
     * @param request
     * @param response
     * @param session
     */
    public void actualizaConfiguracionImpuestos(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = new TarryPrincipal();
        ImpuestosDAO impuestosDAO = new ImpuestosDAO();
        ImpuestosDTO impuestosDTO = new ImpuestosDTO();

        MailMotor mail = new MailMotor();
        Vector errores = new Vector();

        if (request.getParameter("iva").length() > 0) {
            impuestosDTO.setIva(Double.parseDouble(request.getParameter("iva")));
        } else {
            errores.add("EL CAMPO IVA ES OBLIGATORIO");
        }

        if (request.getParameter("isr").length() > 0) {
            impuestosDTO.setIsr(Double.parseDouble(request.getParameter("isr")));
        } else {
            errores.add("EL CAMPO ISR ES OBLIGATORIO");
        }

        if (request.getParameter("ispt").length() > 0) {
            impuestosDTO.setIspt(Double.parseDouble(request.getParameter("ispt")));
        } else {
            errores.add("EL CAMPO ISPT ES OBLIGATORIO");
        }

        if (request.getParameter("ieps").length() > 0) {
            impuestosDTO.setIeps(Double.parseDouble(request.getParameter("ieps")));
        } else {
            errores.add("EL CAMPO IEPS ES OBLIGATORIO");
        }

        if (request.getParameter("ietu").length() > 0) {
            impuestosDTO.setIetu(Double.parseDouble(request.getParameter("ietu")));
        } else {
            errores.add("EL CAMPO IETU ES OBLIGATORIO");
        }

        if (request.getParameter("ide").length() > 0) {
            impuestosDTO.setIde(Double.parseDouble(request.getParameter("ide")));
        } else {
            errores.add("EL CAMPO IDE ES OBLIGATORIO");
        }

        if (errores.size() == 0) {
            // ACTUALIZO EL REGISTRO
            impuestosDAO.ActualizaConfiguracionImpuestos(impuestosDTO);
            RequestDispatcher d = request.getRequestDispatcher("./TarryAux?action=configuracionImpuestos");

// SE CREA EL LOG DEL CAMBIO DE CONFIGURACION DE IMPUESTOS Y SE MANDA UNA NOTIFICACION DE MAIL
            // MAIL
            mail.sendMail(100, "cambio de parametros IMPUESTOS", "el usuario: fulano ha modificado los parametros de impuestos");

            try {
                d.forward(request, response);
            } catch (ServletException ex) {
                Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (errores.size() > 0) {
            principal.setnErrores(errores.size());
            principal.setErrores(errores);
            session.setAttribute("tarryPrincipal", principal);
        }
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/impuestos.jsp");

        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ | SERVICIO QUE ENVIA EMAIL AL RESPONSABLE DE ALMACEN Y DEJA
     * LA VISTA DEL PEDIDO ACTIVADA EN EL MODULO DE ALMACEN
     *
     * @param request
     * @param response
     * @param session
     */
    public void informeAlmacen(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        int idPedido = Integer.parseInt(request.getParameter("idPedido"));
        int idVendedor = Integer.parseInt(request.getParameter("idVendedor"));
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();

        pedidosDAO.cambioEstadoInformeVentasAlmacen(idPedido);

        String asunto = "INFORME DE NUEVO PEDIDO";
        String cuerpoMensaje = "NUEVO PEDIDO REGISTRADO";
        cuerpoMensaje += "UN NUEVO PEDIDO HA SIDO INGRESADO EN EL SISTEMA FAVOR DE DAR SEGUIMIENTO";
        cuerpoMensaje += "EL ID DE PEDIDO ES EL SIGUIENTE: " + idPedido;

        //EMAIL DE PEDIDO A ALMACEN 
        MailMotor email = new MailMotor();
        email.sendMail(100, asunto, cuerpoMensaje);
        // EMAIL DE PEDIDO A ALMACEN 

        RequestDispatcher d = request.getRequestDispatcher("./TarrySystem?action=principal");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO DE NUVO IMPUESTO
     *
     * @param request
     * @param response
     * @param session
     */
    public void nuevoImpuesto(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int index = Integer.parseInt(request.getParameter("index"));
        switch (index) {
            case 1: // MUESTRA EL JSP DE TOS LOS IMPUESTOS Y SU CONFIGURACION DE MUESTREO
                break;
            case 2: // MUESTRA UN POP UP CON EL CAMPO DE TEXTO DE TITULO
                break;
            case 3: // REQUEST DE DATOS 
                break;
        }

    }

    /**
     * ESTE SERVICIO LO VOY A DEROGAR
     *
     * @param request
     * @param response
     * @param session
     */
    public void revisionBanderasCredito(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        CarteraVencidaDAO creditos = new CarteraVencidaDAO();
        creditos.controladorBanderasCredito(1);
        creditos.controladorBanderasCredito(2);
        creditos.controladorBanderasCredito(3);
    }

    /**
     * ALAN GONZALEZ ESTE SERVICIO ACTUALIZA LOS ESTADOS BANDERAS Y FECHAS DE UN
     * PEDIDO EN PARTICULAR ESTE SERVICIO SE EJECUTA AL
     *
     * @param request
     * @param response
     * @param session
     */
    public void pedidoEntregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int idPedido = Integer.parseInt(request.getParameter("idPedido"));
        // SE CALCULAN Y ASIGNAN FECHAS DEL CREDITO
        CarteraVencidaDAO creditosDAO = new CarteraVencidaDAO();
        creditosDAO.protocoloActualizacionFechas(idPedido);
        // SE MUESTREO Y ACTUALIZACION DE TODA LA CARTERA
        CarteraVencidaDAO creditos = new CarteraVencidaDAO();
        creditos.controladorBanderasCredito(1);
        creditos.controladorBanderasCredito(2);
        creditos.controladorBanderasCredito(3);
        RequestDispatcher d = request.getRequestDispatcher("./Almacen?action=inicio");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ ESTE SERVICIO
     *
     * @param request
     * @param response
     * @param session
     */
    public void detallePedido(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int idPedido = Integer.parseInt(request.getParameter("idPedido"));
        int idCliente = Integer.parseInt(request.getParameter("idCliente"));

        
        ReportesPrincipalDTO reporte = new ReportesPrincipalDTO();
        //-->
        CarteraVencidaDAO caretraVencidaDAO = new CarteraVencidaDAO();
        // ACTUALIZA BANDERAS DE ESTADO
        caretraVencidaDAO.controladorBanderasCredito(1);
        caretraVencidaDAO.controladorBanderasCredito(2);
        caretraVencidaDAO.controladorBanderasCredito(3);
        
        CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
        carteraVencidaDTO = caretraVencidaDAO.estadoCreditoPedido(idPedido);
        reporte.setCredito(carteraVencidaDTO);
        //-->

        //-->
        RegistroEnvioDAO registroEnvioDAO = new RegistroEnvioDAO();
        RegistroEnvioDTO registroEnvioDTO = new RegistroEnvioDTO();
        registroEnvioDTO = registroEnvioDAO.registroEnvioDTO(idPedido);
        reporte.setEnvio(registroEnvioDTO);
        //-->

        //-->
        TarryPedidosDAO tarryPedidosDAO = new TarryPedidosDAO();
        TarryPedidosDTO tarryPedidosDTO = new TarryPedidosDTO();
        tarryPedidosDTO = tarryPedidosDAO.unPedidoPorId(idPedido);
        reporte.setPedido(tarryPedidosDTO);
        //-->

        //-->
        TarryItemsPedidoDAO productosDAO = new TarryItemsPedidoDAO();
        Vector productosPedido = new Vector();
        productosPedido = productosDAO.productosReporte(idPedido);
        reporte.setProductosPedido(productosPedido);
        //-->
        
        ClientesDAO clientesDAO = new ClientesDAO();
        ClientesDTO clienteDTO = new ClientesDTO();
        clienteDTO = clientesDAO.clientesDTO(idCliente);
        reporte.setCliente(clienteDTO);

        session.setAttribute("reportesPrincipal", reporte);

        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/reportePedido.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryAux.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
